<?php

Yii::import('tareas.models._base.BaseTarea');

class Tarea extends BaseTarea {

    public $porcentaje;
    public $cuentas;
    public $tipo;
    public $accion;

    /**
     * @return Tarea
     */
    const ESTADO_ACTIVO = 'ACTIVO';
    const ESTADO_INACTIVO = 'INACTIVO';
    const PERMISOS_OWNER = 'OWNER';
    const PERMISOS_ALL = 'ALL';
    const ENTIDAD_TIPO_CUENTA = 'cuenta';
    const ENTIDAD_TIPO_INCIDENCIA = 'incidencia';
    const ENTIDAD_TIPO_CONTACTO = 'contacto';
    const ENTIDAD_TIPO_CAMPANIA = 'campania'; //TODO: CHEKAR
    const ACCION_LLAMADA = 'LLAMADA';
    const ACCION_EMAIL = 'EMAIL';
    const ACCION_SMS = 'SMS';

    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    public static function label($n = 1) {
        return Yii::t('app', 'Tarea|Tareas', $n);
    }

    public function relations() {
        return array_merge(parent::relations(), array(
            'contacto' => array(self::BELONGS_TO, 'Contacto', 'contacto_id'),
            'objetivos' => array(self::HAS_MANY, 'TareaObjetivo', 'tarea_id'),
        ));
    }

    public function getEntidadTipoCuenta() {
        return self::ENTIDAD_TIPO_CUENTA;
    }

    public function getEntidadTipoCampania() {
        return self::ENTIDAD_TIPO_CAMPANIA;
    }

    public function getEntidadTipoContacto() {
        return self::ENTIDAD_TIPO_CONTACTO;
    }

    public function getEntidadTipoIncidencia() {
        return self::ENTIDAD_TIPO_INCIDENCIA;
    }

    public function getPermisosOpciones() {
        return array(
            self::PERMISOS_OWNER => Yii::t('app', 'Usuario Responsable'),
            self::PERMISOS_ALL => Yii::t('app', 'Todos'),
        );
    }

//TODO: comertar función @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
    public function getNombreEntidad() {
        $modelEntidad = ucfirst($this->entidad_tipo);
        $modelEntidad = $modelEntidad::model()->findByPk($this->entidad_id);
        $nombreEntidad = $modelEntidad ? $modelEntidad->nombre : '';

        if ($modelEntidad && $this->entidad_tipo == self::ENTIDAD_TIPO_CONTACTO)
            $nombreEntidad = $modelEntidad->getNombre_completo();

        return $nombreEntidad;
    }

    //TODO: comertar función @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
    public function getAccionUrl() {
        return $this->entidad_tipo == self::ENTIDAD_TIPO_INCIDENCIA ? "/incidencias/incidencia/view" : "/crm/$this->entidad_tipo/view";
    }

    public function getEntidadTipoOpciones() {
        $return = array();

        if (Cuenta::model()->activos()->findAll())
            $return[self::ENTIDAD_TIPO_CUENTA] = Yii::t('app', 'Cuenta');

        if (Contacto::model()->activos()->findAll())
            $return[self::ENTIDAD_TIPO_CONTACTO] = Yii::t('app', 'Contacto');

        if (Incidencia::model()->activos()->findAll())
            $return[self::ENTIDAD_TIPO_INCIDENCIA] = Yii::t('app', 'Incidencia');

        return $return;
    }

    public function getAccionOpciones() {
        $return = array();
        $return[self::ACCION_LLAMADA] = Yii::t('app', 'Llamada');
        $return[self::ACCION_EMAIL] = Yii::t('app', 'Email');
        $return[self::ACCION_SMS] = Yii::t('app', 'Sms');
        return $return;
    }

    public function attributeLabels() {
        return array(
            'id' => Yii::t('app', 'ID'),
            'nombre' => Yii::t('app', 'Nombre'),
            'descripcion' => Yii::t('app', 'Descripción'),
            'fecha_fin' => Yii::t('app', 'Fecha límite'),
            'hora_fin' => Yii::t('app', 'Hora límite'),
            'contacto_id' => Yii::t('app', 'Contacto'),
            'accion' => Yii::t('app', 'Acción'),
            'accion_id' => Yii::t('app', 'Accion'),
            'estado' => Yii::t('app', 'Estado'),
            'usuario_creacion_id' => Yii::t('app', 'Usuario Creación'),
            'usuario_actualizacion_id' => Yii::t('app', 'Usuario Actualización'),
            'fecha_creacion' => Yii::t('app', 'Fecha Creación'),
            'fecha_actualizacion' => Yii::t('app', 'Fecha Actualización'),
            'etapa_id' => Yii::t('app', 'Etapa'),
            'entidad_tipo' => Yii::t('app', 'Entidad Tipo'),
            'entidad_id' => Yii::t('app', 'Entidad'),
            'permisos' => Yii::t('app', 'Permisos'),
            'owner_id' => Yii::t('app', 'Usuario Responsable'),
            'etapa' => null,
        );
    }

    public function scopes() {
        return array(
            'activos' => array(
                'condition' => (Yii::app()->user->isSuperAdmin) ? 't.estado = :estado' : 't.estado = :estado and (t.permisos = :permisos or t.owner_id = :owner_id)',
                'params' => (Yii::app()->user->isSuperAdmin) ?
                        array(
                    ':estado' => self::ESTADO_ACTIVO,) : array(
                    ':estado' => self::ESTADO_ACTIVO,
                    ':permisos' => self::PERMISOS_ALL,
                    ':owner_id' => Yii::app()->user->id,
                        ),
            ),
            'noConcluidas' => array(
                'with' => array('etapa'),
                'condition' => 'etapa.porcentaje < 100',
            ),
            'sinfecha' => array(
                'condition' => 't.fecha_fin IS NULL',
            ),
            'confecha' => array(
                'condition' => 't.fecha_fin IS NOT NULL',
            ),
            'ordenFechaFin' => array(
                'order' => 't.fecha_fin DESC',
            ),
            'limite' => array(
                'limit' => '4',
            ),
        );
    }

    public function de_etapa($etapa_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 'etapa_id = :etapa_id',
                    'params' => array(
                        ':etapa_id' => $etapa_id
                    ),
                )
        );
        return $this;
    }

    public function de_cuenta($cuenta_id) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 't.entidad_id = :cuenta_id',
                    'params' => array(
                        ':cuenta_id' => $cuenta_id
                    ),
                )
        );
        return $this;
    }

    public function de_entidad($entidad_id, $entidad_tipo) {
        $this->getDbCriteria()->mergeWith(
                array(
                    'condition' => 'entidad_id = :entidad_id and entidad_tipo = :entidad_tipo',
                    'params' => array(
                        ':entidad_id' => $entidad_id,
                        ':entidad_tipo' => $entidad_tipo,
                    ),
                )
        );
        return $this;
    }

    public function getCuentaName() {
        $cuenta = Cuenta::model()->findByPk($this->entidad_id);
        return $cuenta ? $cuenta->nombre : '';
    }

    public function getResponsableName() {
        $contacto = Contacto::model()->findByPk($this->contacto_id);
        if ($contacto)
            return $contacto->nombre . ' ' . $contacto->apellido;
    }

    public function getEtapaName() {
        $etapa = TareaEtapa::model()->findByPk($this->etapa_id);
        return $etapa ? $etapa->nombre : '';
    }

    /**
     * Asigna los parametros de busqueda para widget search
     * @return type
     */
    public function searchParams() {
        return array(
            'nombre',
            'entidad_id',
            'contacto_id',
            'owner_id',
            'fecha_fin',
        );
    }

    /**
     * Search especial utilizado para el buen funcionamiento de widget search.
     * @autor Armando Maldonado <amaldonado@tradesystem.com.ec>
     * @return \CActiveDataProvider
     */
    public function search() {
        $criteria = new CDbCriteria;

        $criteria->join = 'LEFT JOIN cruge_user ON cruge_user.iduser = t.owner_id  ';
        $criteria->join .= 'LEFT JOIN contacto on contacto.id= t.contacto_id ';
        $criteria->join .= 'LEFT JOIN cuenta on cuenta.id= t.entidad_id ';
        $criteria->compare('t.nombre', $this->nombre, true, 'OR');
        $criteria->compare('t.fecha_fin', $this->fecha_fin, true, 'OR');
        $criteria->compare('CONCAT(IFNULL(CONCAT(contacto.nombre," "),""),IFNULL(contacto.apellido,""))', $this->contacto_id, true, 'OR');
        $criteria->compare('cuenta.nombre', $this->entidad_id, true, 'OR');
        $criteria->compare('cruge_user.username', $this->owner_id, true, 'OR');

        return new CActiveDataProvider($this, array(
            'criteria' => $criteria,
        ));
    }

    /*     * *************************Consulats SQL************************** */
    /*
     * retorna las Tareas formateadas para el calendario 
     * @autor: Alex Yepez 
     */

    public function getTareasCalendar($entidad_id = null, $entidad_tipo = null, $todos = false) {
        $command = Yii::app()->db->createCommand()
                ->select("t.id as id,
                        concat('Tarea: ',t.nombre) as title,
                        t.fecha_fin as start")
                ->from("truulo_crm.tarea t")
                ->Where("t.estado =:estado", array(':estado' => self::ESTADO_ACTIVO));
        if (!$todos) {
            $command->andwhere("t.fecha_fin > :fecha_fin", array(':fecha_fin' => '0000-00-00'));
        }
        if ($entidad_tipo == self::ENTIDAD_TIPO_CUENTA) {

            $command->leftJoin('contacto cont', '(cont.id=t.contacto_id)');
            $command->leftJoin('cuenta cue', 'cue.id = cont.cuenta_id');
            if ($entidad_id) {
                $command->andWhere('(t.entidad_tipo = :cuenta and t.entidad_id = :entidad_id) or
                (t.entidad_tipo = :contacto and cont.cuenta_id = :entidad_id )', array(':entidad_id' => $entidad_id,
                    ':cuenta' => $entidad_tipo,
                    ':contacto' => self::ENTIDAD_TIPO_CONTACTO));
            }
        }
        if ($entidad_tipo == self::ENTIDAD_TIPO_CONTACTO) {

            if ($entidad_id) {
                $command->andWhere('(t.entidad_tipo = :entidad_tipo and t.contacto_id = :entidad_id)', array(':entidad_id' => $entidad_id,
                    ':entidad_tipo' => $entidad_tipo));
            }
        }
        if ($entidad_tipo == self::ENTIDAD_TIPO_INCIDENCIA) {

            if ($entidad_id) {
                $command->andWhere('(t.entidad_tipo = :entidad_tipo and t.entidad_id = :entidad_id)', array(':entidad_id' => $entidad_id,
                    ':entidad_tipo' => $entidad_tipo));
            }
        }

        return ($command->queryAll());
    }

    public function ActualizarEstadoEntidad($entidad_tipo, $entidad_id) {
        $return = Tarea::model()->updateAll(array('estado' => Tarea::ESTADO_INACTIVO,
            'usuario_actualizacion_id' => Yii::app()->user->id,
            'fecha_actualizacion' => Util::FechaActual()), '(entidad_tipo = :entidad_tipo and entidad_id = :entidad_id) and estado = :estado', array(':entidad_tipo' => $entidad_tipo,
            ':entidad_id' => $entidad_id,
            ':estado' => Tarea::ESTADO_ACTIVO));
        return $return;
    }

    public function AnularRelacion($entidad_id) {
        $return = Cobranza::model()->updateAll(array('contacto_id' => null,
            'usuario_actualizacion_id' => Yii::app()->user->id,
            'fecha_actualizacion' => Util::FechaActual()), '(contacto_id=:contacto_id and entidad_tipo != :entidad_tipo) and estado = :estado', array(':contacto_id' => $entidad_id,
            ':entidad_tipo' => Tarea::ENTIDAD_TIPO_CONTACTO,
            ':estado' => Tarea::ESTADO_ACTIVO));
        return $return;
    }

}
